home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oh!X 2001 Spring
/
Oh!X 2001 Spring Special CD-ROM (Japan).7z
/
Oh!X 2001 Spring Special CD-ROM (Japan) (Track 1).bin
/
GALAXY
/
ohx5-2
/
mapctrl.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-01-10
|
8KB
|
317 lines
/*
Oh!X5号
GalaxyKnigtsサンプル1
マップコントロール部分
*/
#include "stdafx.h"
#include "ohx5_2.h"
long sdata[]={
SIMPLE_CUBE, 2000, 4000, 2000,
FILE_DATA, 1, 150000,
FILE_DATA, 2, 150000,
FILE_DATA, 3, 150000,
FILE_DATA, 4, 150000,
FILE_DATA, 5, 150000,
FILE_DATA, 6, 150000,
FILE_DATA, 7, 150000,
FILE_DATA, 8, 150000,
FILE_DATA, 9, 150000,
SIMPLE_TORUS, 100, 150,
SHAPE_DONE
};
// マップ(これも今回のみ内蔵)
long mapdata[]={
2, -60000,-2000, 60000, 0,0,0,
3, -60000,-2000, 120000, 0,0,0,
4,-120000,-2000, 180000, 0,0,0,
5,-120000,-2000, 120000, 0,0,0,
6,-120000,-2000, 60000, 0,0,0,
7, 240000,-2000,-180000, 0,0,0,
8,-180000,-2000,-180000, 0,0,0,
9,-180000,-2000,-180000, 0,0,0,
10,180000,-2000,-120000, 0,0,0,
10,180000,-2000, -60000, 0,0,0,
0
};
// 衝突/イベント判定エリア
// 0=データ終端
// 1=衝突判定
// 2=イベント(イベント言語の起動)
// 3=ビルトインリンク(配布済みデータの参照)
// 4=ローカルリンク(同一マップの別空間と接続)
// 5=メタリンク(同一サーバー別マップと接続)
// 6=ハイパーリンク(別サーバー別マップと接続) 未対応
long areas[]={
1,
3,
0
};
char *file_datanames[]={
"data\\b02\\B01_F.x",
"data\\b02\\B02_F.x",
"data\\b02\\B03_F.x",
"data\\b02\\b04_F.x",
"data\\b02\\b05_F.x",
"data\\b02\\b06_F.x",
"data\\b02\\b07_F.x",
"data\\b02\\b07_F.x",
"data\\b02\\b07_F.x"
};
void splitpath( char* fpath,char* fname )
{
char *fp,*fn,*fpx;
fp = fpath;
fn = fname;
fpx = NULL;
while( *fn!=0 ){
if( *fn=='\\' ) fpx = fp;
*fp++ = *fn++;
}
*fp = 0;
if( fpx!=NULL ){
fpx++;
*fpx = 0;
}
}
/*
形状の初期化
今回は内蔵データを利用
*/
void init_shapes()
{
HRESULT hr;
int sct,name,i;
float v1,v2,v3;
shapes* spt = shapelist;
char xfilepath[1024];
char *xfilename;
sct = 0;
max_shapes = 0;
while( sdata[sct]!=SHAPE_DONE ){
name = sdata[sct++];
spt->type = name;
spt->scale= 1;
switch( name ){
case SIMPLE_CUBE: // 立方体
v1 = (float)sdata[sct++]/1000; // witdh
v2 = (float)sdata[sct++]/1000; // height
v3 = (float)sdata[sct++]/1000; // depth
hr = D3DXCreateBox( lpD3DD,v1,v2,v3,&(spt->pt),NULL );
break;
case SIMPLE_SPHERE: // 球
v1 = (float)sdata[sct++]/1000; // radius
hr = D3DXCreateSphere( lpD3DD,v1,D3DX_DEFAULT,D3DX_DEFAULT, &(spt->pt),NULL );
break;
case SIMPLE_CYLINDER: // シリンダー
v1 = (float)sdata[sct++]/1000; // base radius
v2 = (float)sdata[sct++]/1000; // top radius
v3 = (float)sdata[sct++]/1000; // height
hr = D3DXCreateCylinder( lpD3DD,v1,v2,v3,D3DX_DEFAULT,D3DX_DEFAULT,&(spt->pt),NULL );
break;
case SIMPLE_TORUS: // トーラス
v1 = (float)sdata[sct++]/1000; // inner radius
v2 = (float)sdata[sct++]/1000; // outer radius
hr = D3DXCreateTorus( lpD3DD,v1,v2,D3DX_DEFAULT,D3DX_DEFAULT,&(spt->pt),NULL );
break;
case FILE_DATA: // X-flie形式のロード
LPD3DXBUFFER xbuf; // XFILEマテリアルバッファ
xfilename = file_datanames[ sdata[sct++] ];
if( xfilename==NULL ) { sct++; break; }
if( FAILED( D3DXLoadMeshFromX( xfilename,
D3DXMESH_SYSTEMMEM,
lpD3DD,
NULL,
&xbuf,
&( spt->mats ),
&( spt->pt ) ) ) ){
sct++;
break;
}
D3DXMATERIAL* lpxmats = (D3DXMATERIAL*)xbuf->GetBufferPointer();
spt->lpmmats = new D3DMATERIAL8[spt->mats];
spt->lpmtexs = new LPDIRECT3DTEXTURE8[spt->mats];
for( i=0; i<(int)(spt->mats); i++ ){
spt->lpmmats[i] = lpxmats[i].MatD3D;
spt->lpmmats[i].Ambient = spt->lpmmats[i].Diffuse;
// テクスチャを作成する。
splitpath( xfilepath,xfilename );
if( lpxmats[i].pTextureFilename != NULL ){
strcat( xfilepath,lpxmats[i].pTextureFilename );
if( FAILED( D3DXCreateTextureFromFile( lpD3DD,
xfilepath,
&( spt->lpmtexs[i] ) ) ) )
spt->lpmtexs[i] = NULL;
}
}
spt->scale = (float)( sdata[ sct++ ] )/1000;
xbuf->Release();
break;
}
spt++;
max_shapes++;
}
}
// 形状データ解放
void release_shapes()
{
DWORD i,j;
shapes * spt = shapelist;
for( i=0;i<max_shapes;i++ ){
if( spt->type==FILE_DATA ){
if( spt->lpmmats != NULL ) delete[] spt->lpmmats;
if( spt->lpmtexs ) {
for( j = 0; j < spt->mats; j++ ) {
if( spt->lpmtexs[j] ){ spt->lpmtexs[j]->Release(); }
}
delete[] spt->lpmtexs;
}
}
xRelease( spt->pt );
spt++;
}
}
// 物体バッファを1つ確保
OBJ3D *make_object( DWORD name )
{
OBJ3D *obj;
obj = new OBJ3D;
obj->back = NULL;
obj->next = objtop;
if( objtop!=NULL ) objtop->back = obj;
objtop = obj;
obj->type = name;
return obj;
}
// 物体バッファを1つ消去
void delete_object( OBJ3D *obj )
{
if( obj==NULL ) return;
if( objtop == obj ) objtop = objtop->next;
if( obj->back != NULL ) obj->back->next = obj->next;
if( obj->next != NULL ) obj->next->back = obj->back;
xDelete( obj );
}
// マップから物体リストを初期化
void init_objects()
{
long name;
int ct=0;
OBJ3D *obj;
for(;;){
name = mapdata[ ct++ ];
if( name==0 ) break;
obj = make_object( name-1 );
obj->pos.x = (float)mapdata[ct++]/1000;
obj->pos.y = (float)mapdata[ct++]/1000;
obj->pos.z = (float)mapdata[ct++]/1000;
obj->rudder.x = D3DXToRadian( mapdata[ct++] );
obj->rudder.y = D3DXToRadian( mapdata[ct++] );
obj->rudder.z = D3DXToRadian( mapdata[ct++] );
}
}
void release_objects()
{
OBJ3D *obj = objtop;
OBJ3D *nx;
while( obj !=NULL ){
nx = obj->next;
delete_object( obj );
obj = nx;
}
}
// プレイヤーステータス初期化
void init_player()
{
make_myself();
D3DXVECTOR3 zero;
zero.x = zero.y = zero.z = 0;
myself->objp->pos = myself->objp->rudder =
myself->objp->move = myself->objp->rotate = zero;
myself->objp->rudder.y = D3DXToRadian( 45 );
}
// プレイヤーによる制御
void player_drive()
{
WORD key = GetKeys();
command_player( myself->objp,( key << 16 )| dpmsg_data_packet );
send_player_control( myself->dplayID, key );
camera_pos = myself->objp->pos;
camera_rud = myself->objp->rudder;
}
// プレイヤーの挙動
// 複数プレイヤー対応版
void command_player( OBJ3D *ob,DWORD cmd )
{
WORD key = (WORD)( cmd>>16 );
if( key & PAD_CMD ){
// 左右に平行移動
// 上下に平行移動
} else {
// 左右に旋回
if( key & PAD_LEFT ){
if( ob->rotate.y<0.05f ) ob->rotate.y += 0.002f;
} else if( key & PAD_RIGHT ){
if( ob->rotate.y>-0.05f ) ob->rotate.y -= 0.002f;
} else {
if( ob->rotate.y>0.002f ) ob->rotate.y *= 0.8f; else ob->rotate.y = 0;
}
// 上下に旋回(最大上下30度。旋回していないときは、自動的に水平に戻る)
if( key & PAD_UP ){
if( ob->rotate.x<0.05f ) ob->rotate.x += 0.002f;
} else if( key & PAD_DOWN ){
if( ob->rotate.x>-0.05f ) ob->rotate.x -= 0.002f;
} else {
ob->rotate.x = 0;
}
}
// 前進
if( key & PAD_FORWARD ){
if( ob->move.z<1 ){
ob->move.z += 0.002f;
} else {
ob->move.z = 1;
}
} else {
if( ob->move.z>0.002f ) ob->move.z *= 0.8f; else ob->move.z = 0;
}
// ベクトル加算
ob->rudder.y += ob->rotate.y;
if( ob->rotate.x!=0 ){
ob->rudder.x += ob->rotate.x;
if( ob->rotate.x<0 ){
if( ob->rudder.x<-0.7f ) ob->rudder.x = -0.7f;
} else {
if( ob->rudder.x> 0.7f ) ob->rudder.x = 0.7f;
}
} else {
ob->rudder.x *= 0.8f;
if( ob->rudder.x<0.01f && ob->rudder.x>-0.01f ){ ob->rudder.x = 0; }
}
// 移動ベクトル生成
D3DXMATRIX mat;
D3DXMatrixRotationY( &mat,-ob->rudder.y );
D3DXVECTOR3 mv;
mv = ob->move;
D3DXVec3TransformNormal( &mv,&mv,&mat );
ob->pos += mv;
}